From: Keir Fraser Date: Fri, 2 Jul 2010 17:53:10 +0000 (+0100) Subject: trace: improve check_tbuf_size() X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~11853 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22?a=commitdiff_plain;h=43b0124af6b67ca65a1b4e82cf6b22b6d56119f8;p=xen.git trace: improve check_tbuf_size() It didn't consider the case of the incoming size not allowing for the 2*data_size range for t_buf->{prod,cons} Signed-off-by: Jan Beulich Signed-off-by: George Dunlap --- diff --git a/xen/common/trace.c b/xen/common/trace.c index caf9b7f621..8d4f02a458 100644 --- a/xen/common/trace.c +++ b/xen/common/trace.c @@ -92,11 +92,19 @@ static void calc_tinfo_first_offset(void) /** * check_tbuf_size - check to make sure that the proposed size will fit - * in the currently sized struct t_info. + * in the currently sized struct t_info and allows prod and cons to + * reach double the value without overflow. */ -static inline int check_tbuf_size(int size) +static int check_tbuf_size(u32 pages) { - return (num_online_cpus() * size + t_info_first_offset) > (T_INFO_SIZE / sizeof(uint32_t)); + struct t_buf dummy; + typeof(dummy.prod) size; + + size = ((typeof(dummy.prod))pages) * PAGE_SIZE; + + return (size / PAGE_SIZE != pages) + || (size + size < size) + || (num_online_cpus() * pages + t_info_first_offset > T_INFO_SIZE / sizeof(uint32_t)); } /**